﻿using System;
using System.Collections.Generic;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Security.Services;
using Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.OrdemDigitacao;

namespace Sinacor.UI.Bovespa.Ordens.Communication
{
    public class OrdemDigitacao : BaseCommunication
    {

        #region Construtor

        public OrdemDigitacao(SessionInformation session)
            : base(session)
        {

        }

        #endregion

        #region ConsultarOrdemDigitacao
        public ModelCollection<Model.BaseDigitacao> ConsultarOrdemDigitacao(Model.Parameter.ConsultarOrdemDigitacao pConsultarOrdemDigitacao)
        {
            List<Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.OrdemDigitacao.OrdemDigitacaoResponse> pRetornoComunication = null;
            IOrdemDigitacao servico = null;
            ModelCollection<Model.OrdemDigitacao> pRetorno = null;

            Translator.TranslatorConsultarOrdemDigitacao TransParamenter = new Translator.TranslatorConsultarOrdemDigitacao();
            Translator.TranslatorOrdemdigitacaoResponse TransResponse = new Translator.TranslatorOrdemdigitacaoResponse();
            Translator.TranslatorConsultarOrdemDigitacaoToBaseDigitacao TransBaseDigitacao = new Translator.TranslatorConsultarOrdemDigitacaoToBaseDigitacao();

            try
            {
                ConsultarOrdemDigitacao ConsutOrdemDigitacao = TransParamenter.Translate(pConsultarOrdemDigitacao);

                using (ServiceInstance<IOrdemDigitacao> serviceManager = new ServiceInstance<IOrdemDigitacao>())
                {
                    servico = serviceManager.TryGetInstance(this.Session);
                    pRetornoComunication = servico.ConsultarOrdemDigitacao(ConsutOrdemDigitacao);
                }

                pRetorno = TransResponse.TranslateToList(pRetornoComunication);
                return TransBaseDigitacao.TranslateToList(pRetorno);
            }

            catch (Exception ex)
            {
                HandleFault(ex);
                return null;
            }
        }
        #endregion
        
        #region ConsultarOrdemDigitacaoLote
        public ModelCollection<Model.BaseDigitacao> ConsultarOrdemDigitacaoLote(Model.Parameter.ConsultarOrdemDistribuicaoOrdemLote pConsultarOrdemDigitacaoLote)
        {
            List<Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.OrdemDigitacao.OrdemDigitacaoResponse> pRetornoComunication = null;
            IOrdemDigitacao servico = null;
            ModelCollection<Model.OrdemDigitacao> pRetorno = null;

            Translator.TranslatorConsultarOrdemDigitacao TransParamenter = new Translator.TranslatorConsultarOrdemDigitacao();
            Translator.TranslatorOrdemdigitacaoResponse TransResponse = new Translator.TranslatorOrdemdigitacaoResponse();
            Translator.TranslatorConsultarOrdemDigitacaoToBaseDigitacao TransBaseDigitacao = new Translator.TranslatorConsultarOrdemDigitacaoToBaseDigitacao();

            try
            {                
                ConsultarOrdemDistribuicaoOrdemLote ConsutOrdemDigitacaoLote = TransParamenter.Translate(pConsultarOrdemDigitacaoLote);

                using (ServiceInstance<IOrdemDigitacao> serviceManager = new ServiceInstance<IOrdemDigitacao>())
                {
                    servico = serviceManager.TryGetInstance(this.Session);
                    pRetornoComunication = servico.ConsultarOrdemDigitacaoLote(ConsutOrdemDigitacaoLote);
                }

                pRetorno = TransResponse.TranslateToList(pRetornoComunication);
                return TransBaseDigitacao.TranslateToList(pRetorno);
            }

            catch (Exception ex)
            {
                HandleFault(ex);
                return null;
            }
        }
        #endregion

        #region Excluir
        public bool Excluir(ModelCollection<Model.Parameter.ExcluirOrdemDigitacao> pExcluirOrdemDigiacao)
        {
            IOrdemDigitacao Servico = null;
            bool result;

            try
            {
                using (ServiceInstance<IOrdemDigitacao> serviceManager = new ServiceInstance<IOrdemDigitacao>())
                {
                    Servico = serviceManager.TryGetInstance(this.Session);
                    result = Servico.Excluir(new Translator.TranslatorExclirOrdemDigitacao().TranslateToList(pExcluirOrdemDigiacao));
                }
            }
            catch (Exception ex)
            {
                HandleFault(ex);
                return false;
            }

            return result;
        }
        #endregion

        #region InserirLoteDigitacao
        public bool InserirLoteDigitacao(ModelCollection<Model.OrdemDigitacao> pLoteDigitacao)
        {
            IOrdemDigitacao Servico = null;
            bool result;

            try
            {
                using (ServiceInstance<IOrdemDigitacao> serviceManager = new ServiceInstance<IOrdemDigitacao>())
                {
                    Servico = serviceManager.TryGetInstance(this.Session);
                    result = Servico.Inserir(new Translator.TranslatorOrdemDigitacao().TranslateToList(pLoteDigitacao));
                }
            }
            catch (Exception ex)
            {
                HandleFault(ex);
                return false;
            }

            return result;
        }
        #endregion

    }
}
